This report presents an analysis of global demographic trends using UNICEF child mortality data and old-age dependency ratios. Through data cleaning, statistical analysis, and interactive visualizations, key patterns were identified. Results show that child mortality remains highest in low-income regions, while aging populations are more prominent in developed countries. The findings highlight the urgent need for targeted health interventions and long-term demographic planning.
#3 Introduction
This report explores global demographic patterns through two key indicators: child mortality rates and old-age dependency ratios. The goal is to raise public awareness about persistent inequalities in child health and the growing challenges of aging populations worldwide.
Global health trends have shown remarkable progress in recent decades, yet deep inequalities remain. In this report, we focus on two critical areas: child vaccination rates and old-age dependency, examining how countries, particularly India, are navigating these demographic challenges.
Code
!pip install pandas plotnine geopandas
Requirement already satisfied: pandas in /usr/local/lib/python3.11/dist-packages (2.2.2)
Requirement already satisfied: plotnine in /usr/local/lib/python3.11/dist-packages (0.14.5)
Requirement already satisfied: geopandas in /usr/local/lib/python3.11/dist-packages (1.0.1)
Requirement already satisfied: numpy>=1.23.2 in /usr/local/lib/python3.11/dist-packages (from pandas) (2.0.2)
Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.11/dist-packages (from pandas) (2.8.2)
Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.11/dist-packages (from pandas) (2025.2)
Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.11/dist-packages (from pandas) (2025.2)
Requirement already satisfied: matplotlib>=3.8.0 in /usr/local/lib/python3.11/dist-packages (from plotnine) (3.10.0)
Requirement already satisfied: mizani~=0.13.0 in /usr/local/lib/python3.11/dist-packages (from plotnine) (0.13.3)
Requirement already satisfied: scipy>=1.8.0 in /usr/local/lib/python3.11/dist-packages (from plotnine) (1.14.1)
Requirement already satisfied: statsmodels>=0.14.0 in /usr/local/lib/python3.11/dist-packages (from plotnine) (0.14.4)
Requirement already satisfied: pyogrio>=0.7.2 in /usr/local/lib/python3.11/dist-packages (from geopandas) (0.10.0)
Requirement already satisfied: packaging in /usr/local/lib/python3.11/dist-packages (from geopandas) (24.2)
Requirement already satisfied: pyproj>=3.3.0 in /usr/local/lib/python3.11/dist-packages (from geopandas) (3.7.1)
Requirement already satisfied: shapely>=2.0.0 in /usr/local/lib/python3.11/dist-packages (from geopandas) (2.1.0)
Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.8.0->plotnine) (1.3.2)
Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.8.0->plotnine) (0.12.1)
Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.8.0->plotnine) (4.57.0)
Requirement already satisfied: kiwisolver>=1.3.1 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.8.0->plotnine) (1.4.8)
Requirement already satisfied: pillow>=8 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.8.0->plotnine) (11.1.0)
Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.8.0->plotnine) (3.2.3)
Requirement already satisfied: certifi in /usr/local/lib/python3.11/dist-packages (from pyogrio>=0.7.2->geopandas) (2025.1.31)
Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.11/dist-packages (from python-dateutil>=2.8.2->pandas) (1.17.0)
Requirement already satisfied: patsy>=0.5.6 in /usr/local/lib/python3.11/dist-packages (from statsmodels>=0.14.0->plotnine) (1.0.1)
Code
import matplotlib.pyplot as plt
Code
import pandas as pdfrom plotnine import*import geopandas as gpdindicator1 = pd.read_csv('/content/drive/MyDrive/unicef_indicator_1.csv')indicator2 = pd.read_csv('/content/drive/MyDrive/unicef_indicator_2.csv')metadata = pd.read_csv('/content/drive/MyDrive/unicef_metadata.csv')
Vaccination Rate Over Time in India
We begin by looking at India’s progress in child immunization over time. The Vaccination Rate Over Time chart reveals a steady rise, reflecting the success of nationwide public health campaigns. However, while these rates are improving, economic factors still play a vital role in health outcomes.
This interactive line chart shows how vaccination rates in India have changed over time. Markers highlight yearly values, revealing major increases in child immunization efforts across the country.
Requirement already satisfied: plotly in /usr/local/lib/python3.11/dist-packages (5.24.1)
Requirement already satisfied: tenacity>=6.2.0 in /usr/local/lib/python3.11/dist-packages (from plotly) (9.1.2)
Requirement already satisfied: packaging in /usr/local/lib/python3.11/dist-packages (from plotly) (24.2)
GDP per Capita vs Life Expectancy in India
Next, we explore the relationship between economic prosperity and life expectancy. The GDP per Capita vs Life Expectancy scatterplot clearly shows that as India’s wealth grew, life expectancy also rose — although gaps remain compared to more developed nations.
This scatter plot explores the relationship between India’s GDP per capita and life expectancy over time. A linear trendline shows how improvements in economic conditions have correlated with increases in life expectancy.
Code
import plotly.express as pximport pandas as pdindia_data = metadata[metadata['country'] =='India'].dropna(subset=['GDP per capita (constant 2015 US$)', 'Life expectancy at birth, total (years)'])fig = px.scatter( india_data, x='GDP per capita (constant 2015 US$)', y='Life expectancy at birth, total (years)', title='GDP per Capita vs Life Expectancy (India)', hover_data=['year'], trendline="ols", trendline_color_override="red")fig.update_traces( hovertemplate='Year: Over the Years<br>GDP: %{x}<br>Life Expectancy: %{y}')fig.show()
Old Age Dependency Ratio in India Since 2000 (by Gender)
As populations live longer, a new concern emerges: aging societies. The Old Age Dependency Ratio in India grouped bar chart highlights how the burden of supporting elderly citizens has increased steadily since 2000 — across both genders. This demographic shift brings significant economic and social implications for the future.
This grouped bar chart displays how India’s old-age dependency ratio has evolved since 2000, separately for males, females, and the total population. It highlights changing gender patterns as the population ages.
Code
!pip install pandas plotnine geopandas plotlyimport matplotlib.pyplot as pltimport pandas as pdfrom plotnine import*import geopandas as gpdimport plotly.express as pxindicator_name ='Old age dependency ratio'india_data = indicator1[ (indicator1['indicator'] == indicator_name) & (indicator1['country'] =='India') & (indicator1['time_period'] >=2000)]fig = px.bar( india_data, x='time_period', y='obs_value', color='sex', title=f'{indicator_name} in India (From 2000)', labels={'time_period': 'Year', 'obs_value': 'Value (in %)'},)fig.update_layout(barmode='group')fig.show()
Requirement already satisfied: pandas in /usr/local/lib/python3.11/dist-packages (2.2.3)
Requirement already satisfied: plotnine in /usr/local/lib/python3.11/dist-packages (0.14.5)
Requirement already satisfied: geopandas in /usr/local/lib/python3.11/dist-packages (1.0.1)
Requirement already satisfied: plotly in /usr/local/lib/python3.11/dist-packages (5.24.1)
Requirement already satisfied: numpy>=1.23.2 in /usr/local/lib/python3.11/dist-packages (from pandas) (2.0.2)
Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.11/dist-packages (from pandas) (2.8.2)
Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.11/dist-packages (from pandas) (2025.2)
Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.11/dist-packages (from pandas) (2025.2)
Requirement already satisfied: matplotlib>=3.8.0 in /usr/local/lib/python3.11/dist-packages (from plotnine) (3.10.0)
Requirement already satisfied: mizani~=0.13.0 in /usr/local/lib/python3.11/dist-packages (from plotnine) (0.13.3)
Requirement already satisfied: scipy>=1.8.0 in /usr/local/lib/python3.11/dist-packages (from plotnine) (1.14.1)
Requirement already satisfied: statsmodels>=0.14.0 in /usr/local/lib/python3.11/dist-packages (from plotnine) (0.14.4)
Requirement already satisfied: pyogrio>=0.7.2 in /usr/local/lib/python3.11/dist-packages (from geopandas) (0.10.0)
Requirement already satisfied: packaging in /usr/local/lib/python3.11/dist-packages (from geopandas) (24.2)
Requirement already satisfied: pyproj>=3.3.0 in /usr/local/lib/python3.11/dist-packages (from geopandas) (3.7.1)
Requirement already satisfied: shapely>=2.0.0 in /usr/local/lib/python3.11/dist-packages (from geopandas) (2.1.0)
Requirement already satisfied: tenacity>=6.2.0 in /usr/local/lib/python3.11/dist-packages (from plotly) (9.1.2)
Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.8.0->plotnine) (1.3.2)
Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.8.0->plotnine) (0.12.1)
Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.8.0->plotnine) (4.57.0)
Requirement already satisfied: kiwisolver>=1.3.1 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.8.0->plotnine) (1.4.8)
Requirement already satisfied: pillow>=8 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.8.0->plotnine) (11.1.0)
Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.8.0->plotnine) (3.2.3)
Requirement already satisfied: certifi in /usr/local/lib/python3.11/dist-packages (from pyogrio>=0.7.2->geopandas) (2025.1.31)
Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.11/dist-packages (from python-dateutil>=2.8.2->pandas) (1.17.0)
Requirement already satisfied: patsy>=0.5.6 in /usr/local/lib/python3.11/dist-packages (from statsmodels>=0.14.0->plotnine) (1.0.1)
Global Old Age Dependency Ratio
Zooming out to the global scale, the Old Age Dependency Ratio World Globe shows that aging populations are not just a local issue. Countries like Japan, Italy, and Germany face the highest old-age dependency burdens, demanding urgent reforms in pensions, healthcare, and workforce planning.
This interactive globe visualizes old-age dependency ratios across countries. Darker red shades indicate higher elderly dependency relative to the working-age population, highlighting regions most affected by aging trends.
Output hidden; open in https://colab.research.google.com to view.
Latest Vaccination Rates Worldwide
Finally, we turn again to child health. The Latest Vaccination Rates World Map starkly highlights that many countries — especially in Africa and parts of Asia — still struggle to provide basic vaccinations. While global averages improve, millions of children remain vulnerable due to unequal access to healthcare.
This interactive world map displays the most recent child vaccination rates across countries. The visualization highlights global inequalities in healthcare access and immunization coverage.
Through this journey, the data tells a powerful story: As countries work to protect their youngest citizens, they must also prepare to care for their oldest. Balancing these priorities will define the next generation of global health and social policy.
Conclusion
This report highlights the complex but interconnected trends shaping global health and demographic change. In India, steady improvements in vaccination rates demonstrate the success of public health initiatives, contributing to longer life expectancies and better child survival outcomes. However, as life expectancy rises, India, like many countries worldwide, faces the growing challenge of supporting an aging population.
Our global visualizations further emphasize these dual pressures. While vaccination coverage has expanded in many parts of the world, significant disparities remain, particularly in low-income regions. Simultaneously, developed nations are contending with rising old-age dependency ratios, reshaping social, economic, and healthcare priorities.
Addressing these challenges will require a balanced approach: investing in both child health and elderly care, while recognizing the underlying economic factors that influence health outcomes. The future of public health will depend not only on curing disease but on building resilient, inclusive systems that serve populations across every stage of life.
Data Sources
The data used in this report is sourced from UNICEF global indicators datasets provided for the BAA1030 Data Storytelling assignment. Additional metadata was used to enhance the demographic analysis.